آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

متد onContextMenu برای ایتم های  ریسایکلر ویو  ( فعلا حل شد )

sana ebadi  9 سال پیش  9 سال پیش
0 0

به نام خدا ..

سلام دوستان .. امیدوارم حالتون خوب باشه 

من بعد از سرچ متوجه شدم که ججور برای ایتم های  RecyclerView  یک contextMenu بسازم 

ینی اومدم کلاسMyViewHoldert رو ک یک کلاس داخلی در کلاس اداپترم رو بود از 

View.OnCreateContextMenuListener
 

ایمپلیمنت کردم و اوکی شد . نیگا کنید این کد من :

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener{

private TextView txt_tittle , txt_genre , txt_year;
private ViewGroup relative_content;

public MyViewHolder(View view) {
super(view);

txt_tittle = (TextView) view.findViewById(R.id.txt_tittle);
txt_genre = (TextView) view.findViewById(R.id.txt_genre);
txt_year = (TextView) view.findViewById(R.id.txt_year);
relative_content = (ViewGroup) view.findViewById(R.id.relative_content);

view.setOnCreateContextMenuListener(this);
}


@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
menu.setHeaderTitle("Select The Action");
menu.add(0 , view.getId() , 0 , "Call");
menu.add(0 , view.getId() , 0 , "SMS");


}

}
 

خب حالا من اینو ساختم و اوکی شد . ولی حالا میخوام متد 

boolean onContextItemSelected(MenuItem item);
 

رو برای انتخاب ایتم های منو بنویسم نمیشه 

اونو نمیشناسه ... چون کلاسم از activity مشتق نشده ..

 حالا کسی هست راهنمایی کنه ؟ ممنون میشم بچه ها :)

+2 0
لینک (9 سال پیش)
0 0
ممنون دوست من ولی جواب پاسخ من در این لینک نیست . من یه جور دیگه لازمش دارم ولی این لینک فوق العاده بود و خیلی ممنوننننننننننننن :) (9 سال پیش)
 برای این سوال 2 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
sana ebadi  9 سال پیش
0 0

دوستان کسی نظری نداره ؟ واقعا درگیرشم ...

حتی اومدم متد های `onCreateContextMenu` و` onContextItemSelected` رو اوردم کلاس اصلیم که extends از AppCompat هست نوشتم .

اوکی بود چون جنسش اکتیوتی بود شناخت ولی برای `registerForContextMenu` دچار مشکل شدم :( !

همونجور که میدونید ورودی این متد یک view هست و من میخوام لایه ی زیر ساخت برای هر سطر از ریسایکر ویویو ام رو بهش بدوم همون RelativeLayout که چنتا ویو رو برای طراحی هر سطر از ریسایکلر ویو ام میگیره .

خب این که لایه ای مرتبط به اکتیویتی اصلیم نیس که راحت بتونم بگیرمش پس مجبور شدم در کلاس G که extends Application هست بنویسم که همه جا در دسترس باشه:

public static RelativeLayout relative_content;

و در کلاس داخلی اداپترم که خودم ساختم که `public class MyViewHolder extends RecyclerView.ViewHolder ` این باشه تعریفش کردم :
به اینصورت `;(G.relative_content = (RelativeLayout) view.findViewById(R.id.relative_content)` مثل بقیه ی ویو ها !

خب حالا من چجور این ویو رو به کلاس اصلیم و به متد 

registerForContextMenu

مربوطش کنم ؟

من مبتدیم و کلی کارهای غیر منطقی انجام دادم که یکیشوناین بود که اینجور نوشتم 

registerForContextMenu(G.relative_content);

 ینی اومد همون relative رو که در کلاس G تعریف کردم دادم ولی خطای 

java.lang.NullPointerException  رو برمیگردوند :)

حتی اینجور نوشتم :

if(G.relative_content != null){
registerForContextMenu(G.relative_content);

}else{
Toast.makeText(G.context, "NOOOOOOO", Toast.LENGTH_SHORT).show();

بهم ارورو NULL نداد ولی همون NOOOO رو داد که ینی مقداری نداره و null هست !

و یا حتی try catch  ههههههههههه

try {
registerForContextMenu(G.relative_content);
}catch (NullPointerException e){
e.printStackTrace();
}

هیچ کدوم اوکی نشد ینی ارور رفت ولی نتیجه ای رو ندیدم :(

دوستان چه راه حل هایی رو پیشنهاد میدید ؟

 

 

+1 0
سلام.این لینک در مورد همین مشکل شماست.بهتره همه جوابای این لینک رو بخونید تا یه دید کلی بدست بیارین تا اگه دوباره به همچین مشکلی برخوردین بتونید با همین تکنیک هایی که اینجا مطرح شده،مشکلو حل کنید تا دیگه برای حل مشکلاتی که براتون پیش میاد،دست به هر کاری (try-catch,static,if ,...)نزنید :) !! (9 سال پیش)
0 0
ممنون دوست من ! ولی من دقیقا از همین لینک استفاده کردم وروش impliment این متد رو از اونجا متوجه شدم :).... و گفتم مبتیدم و با همه چی دست و پنجه نرم میکنم .. این مشکلو هم فعلا میمونه .. میخوام با دیالوگ کار کنم بعد به این مشکل هم رسیدگی میکنم و مشکلی که من دارم در این لینک نیس ... چون من خودم از همین لینک استفاده کردم و با یه روشش به چنتا مشکل دیگه خوردم .. میذارم یه مدت دیگه که اوکیش کنم .. بازم مرسی :) (9 سال پیش)
پاسخ به سوال 
sami  9 سال پیش
+1 0

 پاسخ صحیح

استفاده از دیالوگ بهتره،چون هر طور که بخواین می تونید سفارشی سازیش کنین.

اما  همانطور که گفتم اگه همه جوابای اون لینک رو می خوندین،می تونستین همین روشی که اینجا مطرح کردین رو هم استفاده کنید.

به هر حال اگه خواستین از همین روش استفاده کنین،می تونید از کدای زیر استفاده کنید.

(من بجای view.getId از اعداد 1 و 2 استفاده کردم و توی اکتیویتی هم همین مقادیرو توی switch استفاده کردم)

1 - کدای کلاس RecyclerView تون رو مثه کدای زیر تغییر بدین :

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>
{

//...

public int position;

public int getPosition() {
return position;
}

public void setPosition(int position) {
this.position = position;
}


@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
//...


holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
setPosition(position);
return false;
}
});


}


@Override
public void onViewRecycled(ViewHolder holder) {
holder.itemView.setOnLongClickListener(null);
super.onViewRecycled(holder);
}



public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener
{
//...

public ViewHolder(View itemLayoutView)
{
super(itemLayoutView);
//...
itemLayoutView.setOnCreateContextMenuListener(this);
}

@Override
public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
contextMenu.setHeaderTitle("Select The Action");
contextMenu.add(0, 1, 0, "Call");//groupId, itemId, order, title
contextMenu.add(0, 2, 0, "SMS");
}
}


}
 

2 - تو اکتیویتی شامل RecyclerView هم متد زیر رو قرار بدین :

 @Override
public boolean onContextItemSelected(MenuItem item) {
int position;
try {
position = mAdapter.getPosition();

} catch (Exception e) {
Log.d("myTAG", e.getLocalizedMessage(), e);
return super.onContextItemSelected(item);
}
switch (item.getItemId()) {
case 1:
// do your stuff
Toast.makeText(mainPage.this, "(Call)position = " + position, Toast.LENGTH_SHORT).show();
break;
case 2:
// do your stuff
Toast.makeText(mainPage.this, "(SMS)position = " + position, Toast.LENGTH_SHORT).show();


break;

}
return super.onContextItemSelected(item);
}
 

 

+1 0
خیلی ممنون دوست عزیز و من اصلا ناراحت نشدم چون جای ناراحتی نداشت هههه ! خب خیلی ممنون بابت این کد حتما تستش میکنم ولی من کارمو با دیالوگ انجام دادم و اوکی شد ولی خواستم بعد یه این مورد برسم که لطف کردین حتما سر فرصت تستش میکنم . خیلی ممنون دوست من :) (9 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .